import axios, {
  type AxiosInstance,
  type InternalAxiosRequestConfig,
  type AxiosResponse,
} from "axios";

// 创建 axios 实例
const service: AxiosInstance = axios.create({
  baseURL: "", // import.meta.env.VITE_API_BASE_URL, // 从环境变量中获取基地址
  timeout: 10000, // 请求超时时间
  headers: { "Content-Type": "application/json;charset=utf-8" },
});

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 请求前把对于的参数callback删除

    if (config.data) {
      let params = JSON.parse(JSON.stringify(config.data));
      if (params.callback || params.cb) {
        params.callback = undefined;
        params.cb = undefined;
      }
      config.data = JSON.stringify(params);
    }

    // 在请求发送之前做一些处理，例如添加 token
    const token = localStorage.getItem("token");
    if (token) {
      config.headers = config.headers || {};
      config.headers.Authorization = `Bearer ${token}`;
    }

    return config;
  },
  (error) => {
    // 请求错误处理
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做一些处理
    const { data } = response;
    // console.log(response, "rr");

    // blob类型数据处理
    if (response.config.responseType === "blob") {
      return response;
    } else if (data.code === 200) {
      return data;
    } else {
      // 通用状态处理
      switch (data.code) {
        case 401:
          // 401错误处理
          return Promise.reject(data);
        case 403:
          // 403错误处理
          return Promise.reject(data);
        case 404:
          // 404错误处理
          return Promise.reject(data);
        case 500:
          // 500错误处理
          return Promise.reject(data);

        case 10007:
          //token 过期了
          window.location.href = "/login";
          return Promise.reject(data);
        default:
          // 其他错误处理
          ElMessage.error(data.data || "系统错误");
          return data;
      }
    }
  },
  (error) => {
    // 响应错误处理
    return Promise.reject(error);
  }
);

export default service;
